package com.xpffly.springboot.config.log.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/**
 * @Author: xpengfei
 * @Date: 2021/1/15 20:23
 * @Description：日志切面
 */
@Aspect
@Component
public class LogAspect {

    private static final Logger logger = LoggerFactory.getLogger("COLLECT_LOG_INFO");

    /**
     * controller 层切点
     */
    @Pointcut("@annotation(com.xpffly.springboot.config.log.annotation.ControllerLogAspect)")
    public void controllerLog() {
    }

    /**
     * service 层切点
     */
    @Pointcut("@annotation(com.xpffly.springboot.config.log.annotation.ServiceLogAspect)")
    public void serviceLog() {
    }

    /**
     * controller 包切点
     */
    @Pointcut("execution(public * com.xpffly.springboot.controller..*.*(..))*")
    public void controllerPackageLog() {
    }

    /**
     * Before： 前置通知----方法开始执行之前执行
     *
     * @param joinPoint
     */
    @Before("controllerPackageLog()")
    public void doBefore(JoinPoint joinPoint) {
        logger.info("{}---请求开始---", joinPoint.getSignature().getDeclaringTypeName() + "."
                + joinPoint.getSignature().getName());
    }


    /**
     * After： 后置通知，方法执行后执行
     */
    @After("controllerPackageLog()")
    public void doAfter() {
    }

    /**
     * AfterReturning： 返回后通知，在方法返回后执行
     * 处理完请求后执行
     *
     * @param joinPoint 切点
     */
    @AfterReturning(pointcut = "controllerPackageLog()", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
        logger.info("{}---请求处理完成---", joinPoint.getSignature().getDeclaringTypeName() + "."
                + joinPoint.getSignature().getName());
    }

    /**
     * AfterThrowing： 异常通知，在抛出异常时执行
     */
//    @AfterThrowing()
//    public void doAfterThrowing() {
//    }

    /**
     * Around：环绕通知，在方法执行前和执行后都会执行
     * 
     */
//    @Around("")
//    public void doAround() {
//    }
}
